#include <iostream>
#include <unistd.h>
using namespace std;

int main(int argc, char* argv[])
{
	int bh=8;
	string message = "燕雀焉知鸿鹄之志。";

	pid_t pid = fork();
	// fork之后，子进程和父进程都从fork的地方开始执行
	
    // cout << "pid=" << pid << endl;
	// fork()函数被调用一次，但返回两次。两次返回的区别是子进程的返回值是0，而父进程的返回值则是子进程的进程ID。

	// 子进程获得了父进程数据空间、堆和栈的副本（注意：子进程拥有的是副本，不是和父进程共享）。
    // fork()之后，父进程和子进程的执行顺序是不确定的。
	// cout << "亲爱的" << bh << "号：" << message << endl;
	
	// 可以根据fork返回的pid不同，让父进程和子进程执行不同的代码
	// 虽然bh和message的地址是一样的（子进程是副本），但子进程修改不会影响主进程
	if(pid>10){
		sleep(1);
	    cout << "父：pid=" << pid << endl;
	    cout << "父：亲爱的" << bh << "号：" << message << endl;
	}
	else {
		bh=3;
		message="你不行！";
	    cout << "子：pid=" << pid << endl;
	    cout << "子：亲爱的" << bh << "号：" << message << endl;
	}
	
	// sleep(20);

	cout << "程序结束\n";
}
